package com.study.shengsiyuan.example08;

import java.io.IOException;

import io.grpc.Server;
import io.grpc.ServerBuilder;

public class GrpcServer {
	private Server server;
	//启动服务
	private void start() throws IOException {
		this.server = ServerBuilder
				.forPort(8899)
				.addService(new StudentServiceIpml())
				.build()
				.start();
		System.out.println("server started!");
		// 回调钩子， 这个钩子是异步的 。
		// 是JVM关闭前， 可以执行任务 的最后一个地方。
		// Runtime.getRuntime() : 获取当前应用环境。
		// addShutdownHook():注册一个虚拟机（JVM）关闭钩子
		// 此关闭钩子 是一个未启动的线程，当jvm关闭时，会启动所有的关闭钩子
		// jvm关闭 ： 1、正常关闭（程序正常停止）；2、异常关闭 （ Ctrl+C: 终止程序 ）
		//钩子函数 ：一般运行耗时较短的任务

		Runtime.getRuntime().addShutdownHook(new Thread(()-> {
			System.out.println("关闭jvm");
			GrpcServer.this.stop();
		}));
		System.out.println("执行到这里");
	}
	//关闭服务
	private void stop() {
		if(null != this.server)this.server.shutdown();
	}
	//阻塞服务，不让它关闭
	private void awaitTermination() throws InterruptedException{
		if(null != this.server) {
			this.server.awaitTermination();//无限等待
			//this.server.awaitTermination(3, TimeUnit.SECONDS);//只等待3s
		}
	}

	public static void main(String[] args) throws IOException, InterruptedException {
		GrpcServer grpcServer = new GrpcServer();
		grpcServer.start();
		//如果不加这行代码，服务器启动就关闭了，
		//而awaitTermination（）方法就是让服务器等待，不让它关闭的。
		grpcServer.awaitTermination();
	}
}
